package a.a003;

import java.lang.reflect.InvocationTargetException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.beanutils.PropertyUtils;

public class Test1 {
	
	
	
	/**
	 * 对于 pxf 来说，@{...} 是个特殊字符
	 * @{name}：去 Student 中取 name 属性的 值，作为 单元格的值
	 * 
	 * 1、那如果真的要 在 单元格中 填入 "@{name}" 这个字符串 怎么办？参考"转义字符"的做法
	 * @{@{name}}:			表示 纯文本 "@{name}"，因为  "@{name}" 不能作为 变量的名称，参见下面的 2、
	 * @{@{@{name}}}:		表示 纯文本 "@{@{name}}"
	 * @{@{@{@{name}}}}:	表示 纯文本 "@{@{@{name}}}"
	 * 以此类推...
	 * 
	 * 2、另一个重要的 原因是：@{name} 不能作为 变量名
	 * String @{name} = "jack"; //编译出错：错误的 变量名 
	 */
	public static void main11(String[] args) {
		String element = "@{@{@{name}}}";
//		String element = "@{@{name}}";
//		String element = "@{name}";
		Pattern pattern1 = Pattern.compile("@\\{([\\s\\S]*?)\\}");
		Matcher matcher1 = pattern1.matcher(element);
		
		System.out.println("groupCount: " + matcher1.groupCount());
		
		if (matcher1.matches()) {
			System.out.println("==> 匹配成功");
			
			System.out.println("0 => \"" + matcher1.group(0) + "\"");
			System.out.println("1 => \"" + matcher1.group(1) + "\"");
		}
	}
	
	/**
	 * 转义字符
	 */
	public static void main1(String[] args) {
		System.out.println("\n"); //@{name}
		System.out.println("==============");
		System.out.println("\\n");//@@{name}
		System.out.println("==============");
		System.out.println("\\\\n");//@@@@{name}
		System.out.println("==============");
		System.out.println("\\n");
		System.out.println("==============");
		System.out.println("\\");
	}
	

	public static void main(String[] args) throws Exception {
		Student student = new Student(11, "张三", "上海");
		
		System.out.println(getCellValue(student, "@{name}"));
		System.out.println(getCellValue(student, "@{@{name}}"));
		System.out.println(getCellValue(student, "@{@{@{name}}}"));
		System.out.println(getCellValue(student, "@{@{@{@{name}}}}"));
		System.out.println(getCellValue(student, "@{@{@{@{@{name}}}}}"));
	}

	
	public static Object getCellValue(Object data, Object property) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		Object cellValue;
		
		if(property instanceof String) {
			Pattern pattern1 = Pattern.compile("@\\{([\\s\\S]*?)\\}"); //匹配 @{...}
			Matcher matcher1 = pattern1.matcher((String) property);
			
			if (matcher1.matches()) {//javaBean 的 属性
				
				Matcher matcher2 = pattern1.matcher(matcher1.group(1));
				
				if (matcher2.matches()) { //@{@{name}}、@{@{@{name}}}
					 /**
					  * 有多层 @{...}，例如：@{@{name}}
					  * 处理方式：转义一次，将 纯文本 "@{@{name}}" 转为 纯文本"@{name}"
					  */
					cellValue = matcher1.group(1);
					
				}else { //@{name}
					 /**
					  * 只有一层 @{...}，例如：@{name}
					  * 处理方式：取 student 对象的 name 属性，作为返回值
					  */
					
//					System.out.println("==> 匹配成功");//@{name}, @{age}
//					
//					System.out.println(0 + "::\"" + matcher1.group(0) + "\"");
//					System.out.println(1 + "::\"" + matcher1.group(1) + "\"");
//					System.out.println(2 + "::\"" + matcher1.group(2) + "\"");
					
					String propertyName = matcher1.group(1);
					cellValue = PropertyUtils.getProperty(data, propertyName);
					/**
					 * 当 Student 没有 aaa 属性时，PropertyUtils.getProperty() 会报错：
					 * Exception in thread "main" java.lang.NoSuchMethodException: Unknown property 'aaa' on class 'Student'
					 * 
					 * 因为 这个 操作 具有 "开发者的 主观性"，所以不应当 try-catch 这个错误
					 */
				}
				
				
			}else {//纯文本
//				System.out.println("==> 匹配失败");
				
				cellValue = property;
			}
			
		}else {//纯文本
			cellValue = property;
		}
		
		return cellValue;
	}

}
